home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 1999 November / Macworld (1999-11).dmg / Updaters / WhiteCap 3.0.4 / WhiteCap Source.sit / WhiteCap Source / Common / math / V3.cpp < prev    next >
C/C++ Source or Header  |  1999-07-24  |  3KB  |  141 lines

  1. #include "V3.h"
  2. #include "R3Matrix.h"
  3. #include "Plane.h"
  4.  
  5. void V3::normalize() {
  6.     PFloat    d;
  7.     
  8.     d = 1 / magnitude();
  9.     mX *= d;
  10.     mY *= d;
  11.     mZ *= d;
  12. }
  13.  
  14.  
  15.  
  16.  
  17. void V3::transform( const R3Matrix& inMatrix ) {
  18.     PFloat y = mY, x = mX;
  19.     
  20.     mX = inMatrix.mM[0] * x + inMatrix.mM[1] * y + inMatrix.mM[2] * mZ; 
  21.     mY = inMatrix.mM[3] * x + inMatrix.mM[4] * y + inMatrix.mM[5] * mZ; 
  22.     mZ = inMatrix.mM[6] * x + inMatrix.mM[7] * y + inMatrix.mM[8] * mZ; 
  23. }
  24.  
  25.  
  26.  
  27. void V3::transform( const R3Matrix& inMatrix, float inPerspectiveZ ) {
  28.     PFloat y = mY, x = mX;
  29.     PFloat xt, yt;
  30.     
  31.     xt = inMatrix.mM[0] * x + inMatrix.mM[1] * y + inMatrix.mM[2] * mZ; 
  32.     yt = inMatrix.mM[3] * x + inMatrix.mM[4] * y + inMatrix.mM[5] * mZ; 
  33.     mZ = inMatrix.mM[6] * x + inMatrix.mM[7] * y + inMatrix.mM[8] * mZ; 
  34.     
  35.     mX = xt / ( mZ + inPerspectiveZ );
  36.     mY = yt / ( mZ + inPerspectiveZ );
  37. }
  38.  
  39.  
  40.  
  41.  
  42. void V3::transform( const R3Matrix& inMatrix, const V3& inPt ) {
  43.     PFloat y = inPt.mY, x = inPt.mX, z = inPt.mZ;
  44.     
  45.     mX = inMatrix.mM[0] * x + inMatrix.mM[1] * y + inMatrix.mM[2] * z; 
  46.     mY = inMatrix.mM[3] * x + inMatrix.mM[4] * y + inMatrix.mM[5] * z; 
  47.     mZ = inMatrix.mM[6] * x + inMatrix.mM[7] * y + inMatrix.mM[8] * z; 
  48. }
  49.  
  50.  
  51.  
  52. void V3::cross( const V3& inV ) {
  53.     PFloat x = mX, y = mY;
  54.     
  55.     mX = inV.mZ * y - mZ * inV.mY;
  56.     mY = mZ * inV.mX - inV.mZ * x;
  57.     mZ = x * inV.mY - inV.mX * y;
  58. }
  59.  
  60.  
  61.  
  62.  
  63. void V3::cross( const V3& inA, const V3& inB ) {
  64.     
  65.     mX = inA.mZ * inB.mY - inB.mZ * inA.mY;
  66.     mY = inB.mZ * inA.mX - inA.mZ * inB.mX;
  67.     mZ = inB.mX * inA.mY - inA.mX * inB.mY;
  68. }
  69.  
  70.  
  71. void V3::rotate( const V3& inPt1, const V3& inPt2, PFloat inAng ) {
  72.     PFloat x, s, c;
  73.     V3 line; 
  74.     
  75.     line.set( inPt1 );
  76.     line.subtract( inPt2 );
  77.     subtract( inPt1 );
  78.     toPlane( line );
  79.     s = sin( inAng );
  80.     c = cos( inAng );
  81.     x = mX;
  82.     mX = x * c - mY * s;
  83.     mY = x * s + mY * c;
  84.     fromPlane( line );
  85.     add( inPt1 );
  86. }
  87.  
  88. #define TOO_BIG    1.0e20
  89.  
  90.  
  91. bool V3::intersection( const Plane& inPlane, const V3& inLine, const V3& inPt ) {
  92.  
  93.     PFloat t = ( inPlane.mD - inPlane.dot( inPt ) ) / inPlane.dot( inLine );
  94.     set( inLine );
  95.     scale( t );
  96.     add( inPt );
  97.     
  98.     return t > - TOO_BIG && t < TOO_BIG;
  99. }
  100.  
  101.  
  102.  
  103.  
  104.  
  105. #define A    inNormal.mX
  106. #define B    inNormal.mY
  107. #define C    inNormal.mZ
  108.  
  109. void V3::toPlane( const V3& inNormal ) {
  110.     PFloat    BC        = sqrt( B*B + C*C );
  111.     PFloat    ABC        = inNormal.magnitude();
  112.     PFloat    x = mX, y = mY;
  113.     
  114.     if ( BC > 0.0001 ) {
  115.         mX = x * BC / ABC - A * ( B*y + C*mZ ) / (ABC * BC);
  116.         mY = (C*y - B*mZ) / BC;
  117.         mZ = (A*x + B*y + C*mZ) / ABC; }
  118.     else { 
  119.         mX = mZ;
  120.         mZ = - x;
  121.     }
  122.         
  123. }
  124.  
  125.  
  126.  
  127.  
  128. void V3::fromPlane( const V3& inNormal ) {
  129.     PFloat    BC        = sqrt( B*B + C*C );
  130.     PFloat    ABC        = inNormal.magnitude();
  131.     PFloat    x = mX, y = mY;
  132.     
  133.     if ( BC > 0.0001 ) {
  134.         mX = (x * BC + A * mZ ) / ABC;
  135.         mY = C * y / BC - A * B * x / ( BC*ABC ) + B * mZ / ABC; 
  136.         mZ = - B * y / BC - A * C * x / ( BC*ABC ) + C * mZ / ABC; } 
  137.     else {
  138.         mX = - mZ;
  139.         mZ = x; 
  140.     }
  141. }